package org.moore.controller;

import org.moore.model.Map;
import org.moore.utils.Countdown;
import org.moore.utils.Data;
import org.moore.utils.MusicUtils;

import javax.swing.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;

import static org.moore.utils.BlockUtils.*;
// 游戏地图监听类
public class BlockSwapListener implements MouseListener, MouseMotionListener {
    // 定义布尔值用于两次点击
    private boolean isFirstClick = true;
    // 定义第一个被点击的消除物的行
    private int firstBlockRow;
    // 定义第一个被点击的消除物的列
    private int firstBlockCol;
    // 定义一个布尔变量用于判断是否正在处理消除操作
    private boolean isProcessing = false;
    // 定义消除音乐
    private static final MusicUtils musicXin = new MusicUtils("Music/xin.wav");

    @Override
    public void mousePressed(MouseEvent e) {
        // 每点击一次自增1
        Data.COUNT++;
        // 时间模式下首次点击后开始计时
        if (Data.COUNT == 1 && Map.isMapType() == 2){
            Countdown.start();
        }
        // 如果正在处理消除操作，则不执行任何操作
        if (isProcessing) {
            return;
        }
        // 进入循环
        for (int i = 0; i < Map.getMap().length; i++) {
            for (int j = 0; j < Map.getMap()[0].length; j++) {
                // 获取每个消除物的坐标
                int x = Data.START_X + j * Data.GRID;
                int y = Data.START_Y + i * Data.GRID;
                // 判断点击位置是否在范围内
                if (e.getX() >= x && e.getX() <= x + Data.W && e.getY() >= y && e.getY() <= y + Data.H ) {
                    if (Map.getMap()[i][j].getBlockType() != 0) {
                        // 判断true为第一次点击
                        if (isFirstClick) {
                            // 获取第一个被点击的消除物的位置
                            firstBlockRow = (e.getY() - Data.START_Y) / Data.GRID;
                            firstBlockCol = (e.getX() - Data.START_X) / Data.GRID;
                            // 将第一个被点击的消除物已选中设置为已选中
                            Map.getMap()[firstBlockRow][firstBlockCol].setSelected(true);
                            // 切换到第二次点击
                            isFirstClick = !isFirstClick;
                        } else {
                            // 获取第二个被点击的消除物的行
                            int secondBlockRow = (e.getY() - Data.START_Y) / Data.GRID;
                            // 获取第二个被点击的消除物的列
                            int secondBlockCol = (e.getX() - Data.START_X) / Data.GRID;
                            // 判断两次点击的消除物是否相邻
                            if (firstBlockRow == secondBlockRow && Math.abs(firstBlockCol - secondBlockCol) == 1 ||
                                    firstBlockCol == secondBlockCol && Math.abs(firstBlockRow - secondBlockRow) == 1) {
                                // 添加线程用于消除物的交换消除与下落及其动画
                                new Thread(() -> {
                                    // 在开始消除操作前，将正在下落设置为true
                                    isProcessing = true;
                                    // 定义是否已经消除完毕
                                    boolean isBoom = false;
                                    // 消除物交换
                                    blockExchange(firstBlockRow,firstBlockCol,secondBlockRow,secondBlockCol);
                                    // 如果不能消除则换回来
                                    if (!findBlocksEliminated()) {
                                        blockExchange(firstBlockRow,firstBlockCol,secondBlockRow,secondBlockCol);
                                    }
                                    // 进入循环，直到没有可自动消除的为止
                                    while(findBlocksEliminated()){
                                        // 消除物消除
                                        blockIsEliminated();
                                        // 消除物生成并下落
                                        blockGenerate();
                                        // 播放音效
                                        musicXin.play();
                                        // 设置已经消除完毕
                                        isBoom = true;
                                    }
                                    // 步数模式下根据是否消除步数-1
                                    if (Map.isMapType() == 1 && isBoom) {
                                        Data.STEPS--;
                                        // 步数用完提示
                                        if (Data.STEPS == 0){
                                            JOptionPane.showMessageDialog(null, "步数已用完！游戏结束！");
                                            Application.nextLevel();
                                        }
                                    }
                                    // 在消除操作结束后，将正在下落设置为false
                                    isProcessing = false;
                                }).start();
                                // 切换到第一次点击
                                isFirstClick = !isFirstClick;
                            } else {
                                // 否则返回第一次点击
                                Map.getMap()[firstBlockRow][firstBlockCol].setSelected(false);
                                isFirstClick = true;
                            }
                        }
                    }
                }
            }
        }
    }
    @Override
    public void mouseReleased(MouseEvent e) {}
    @Override
    public void mouseMoved(MouseEvent e) {}
    @Override
    public void mouseDragged(MouseEvent e) {}
    @Override
    public void mouseClicked(MouseEvent e) {}
    @Override
    public void mouseEntered(MouseEvent e) {}
    @Override
    public void mouseExited(MouseEvent e) {}

}
